/* Upload 上传类型声明 */
// https://element-plus.gitee.io/zh-CN/component/upload.html#属性
import type {
  UploadFile,
  UploadFiles,
  UploadRawFile,
  UploadUserFile,
  UploadProgressEvent,
  UploadRequestOptions
} from 'element-plus'
import { Awaitable } from 'element-plus/es/utils'

// element-plus el-upload 组件类型声明
export type TElUploadListType = 'text' | 'picture' | 'picture-card'
export interface IElUpload {
  action?: string // 请求 URL - 是
  headers?: Headers | Record<string, any> // 设置上传的请求头部
  method?: string // 设置上传请求方法 - 'post'
  multiple?: boolean // 是否支持多选文件 - false
  data?: Record<string, any> // 上传时附带的额外参数
  name?: string // 上传的文件字段名 - 'file'
  withCredentials?: boolean // 支持发送 cookie 凭证信息 - false
  showFileList?: boolean // 是否显示已上传文件列表 - true
  drag?: boolean // 是否启用拖拽上传 - false
  accept?: string // 接受上传的文件类型（thumbnail-mode 模式下此参数无效）https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#accept
  fileList?: UploadUserFile[] // 默认上传文件
  listType?: TElUploadListType // 文件列表的类型	- 'text
  autoUpload?: boolean // 是否自动上传文件 - true
  httpRequest?: (options?: UploadRequestOptions) => XMLHttpRequest // 覆盖默认的 Xhr 行为，允许自行实现上传文件的请求
  disabled?: boolean // 是否禁用上传 - false
  limit?: number // 允许上传文件的最大数量
  onPreview?: (uploadFile?: UploadFile) => void // 点击文件列表中已上传的文件时的钩子
  beforeUpload?: (
    rawFile?: UploadRawFile
  ) => Awaitable<void | undefined | null | boolean | File | Blob> // 上传文件之前的钩子，参数为上传的文件， 若返回false或者返回 Promise 且被 reject，则停止上传。
  onChange?: (uploadFile?: UploadFile, uploadFiles?: UploadFiles) => void // 文件状态改变时的钩子，添加文件、上传成功和上传失败时都会被调用
  onProgress?: (
    evt: UploadProgressEvent,
    uploadFile?: UploadFile,
    uploadFiles?: UploadFiles
  ) => void // 文件上传时的钩子
  onSuccess?: (response?: any, uploadFile?: UploadFile, uploadFiles?: UploadFiles) => void // 文件上传成功时的钩子
  onError?: (error?: Error, uploadFile?: UploadFile, uploadFiles?: UploadFiles) => void // 文件上传失败时的钩子
  onExceed?: (files?: File[], uploadFiles?: UploadFiles) => void // 当超出限制时，执行的钩子函数
  beforeRemove?: (uploadFile?: UploadFile, uploadFiles?: UploadFiles) => Awaitable<boolean> // 删除文件之前的钩子，参数为上传的文件和文件列表， 若返回 false 或者返回 Promise 且被 reject，则停止删除。
  onRemove?: (uploadFile?: UploadFile, uploadFiles?: UploadFiles) => void // 文件列表移除文件时的钩子
}

// 自定义类型声明
export interface IUpload extends IElUpload {
  hiddenTip?: boolean // 是否隐藏tip - true
  tip?: string // tip内容 - '自定义提示tip'
  size?: number // 文件上传限制大小 MB
  compress?: boolean // 文件压缩
  compressWidth?: number // 压缩图片宽度
}
